/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package picstore.web.filter;

import java.io.IOException;
import java.util.Collection;
import javax.servlet.*;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.engine.FilterDefinition;
import picstore.util.HibernateUtil;

/**
 *
 * @author erica
 * 
 * Define que a sessão do Hibernate será aberta no inicio do processamento da 
 * requisição no servidor e finalizada no final do processamento. Isso significa que
 * durante todo o trabalho de processamento e operações a sessão do Hibernate estará
 * aberta e disponíel e será finalizada e efetivada no banco de dados antes de entregar
 * o resultado para o usuário. =)
 */
public class ConexaoHibernateFilter implements Filter {
    
    private SessionFactory sf;
 

    
    public void init(FilterConfig filterConfig) throws ServletException {
        this.sf = HibernateUtil.getSessionFactory();
        System.out.println("***********pegando a session factory");
    }

    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            this.sf.getCurrentSession().beginTransaction();
            System.out.println("***********Mandando a requisição");
            chain.doFilter(request, response);
            System.out.println("***************Resposta Recebida");
            this.sf.getCurrentSession().getTransaction().commit();
            this.sf.getCurrentSession().close();
        
        }catch(Throwable ex){
            System.out.println("**************Deu erro!");
            try{
                 
             if(this.sf.getCurrentSession().getTransaction().isActive())
                 this.sf.getCurrentSession().getTransaction().rollback();
            }catch (Throwable t){
                 
                t.printStackTrace();
            }
            throw new ServletException(ex);
        
        }
    }

    
    public void destroy() {
        
    }


    
    
}
